/**
 * Copyright (C) 2011 GreenSoft S.A.
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *        http://www.apache.org/licenses/LICENSE-2.0
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package ar.com.greensoft.neosystem.model.constraint;

import static java.lang.annotation.ElementType.ANNOTATION_TYPE;
import static java.lang.annotation.ElementType.FIELD;
import static java.lang.annotation.ElementType.METHOD;
import static java.lang.annotation.RetentionPolicy.RUNTIME;

import java.lang.annotation.Documented;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;

import javax.validation.Constraint;
import javax.validation.Payload;

/**
 * <p>
 * <b>European Article Number</b> es un sistema de códigos de barras adoptado por 
 * más de 100 países y cerca de un millón de empresas (2003). En el año 2005, la 
 * asociación EAN se ha fusionado con la UCC (Uniform Code Council) para formar una 
 * nueva y única organización mundial identificada como GS1, con sede en Bélgica.
 * <p>
 * El código EAN más usual es EAN13, constituido por 13 dígitos y con una estructura 
 * dividida en cuatro partes:
 * <ul>
 * 	<li>Los primeros dígitos del código de barras EAN identifican el país que otorgó 
 * el código, no el país de origen del producto. Por ejemplo, en Chile se encarga de 
 * ello una empresa responsable adscrita al sistema EAN y su código es el '780'.</li>
 * <li>Referencia del ítem, compuesto de:
 * 	<ul>
 * 		<li><b>Código de empresa</b>. Es un número compuesto por entre 5 y 8 dígitos, que 
 * identifica al propietario de la marca.</li>
 * 		<li><b>Código de producto</b>. Completa los 12 primeros dígitos.</li>
 * 	</ul>
 * <li>Dígito de control. Para comprobar el dígito de control (por ejemplo, 
 * inmediatamente después de leer un código de barras mediante un escáner), 
 * numeramos los dígitos de derecha a izquierda. A continuación se suman 
 * los dígitos de las posiciones impares, el resultado se multiplica por 3, 
 * y se le suman los dígitos de las posiciones pares. Se busca decena 
 * inmediatamente superior y se le resta el resultado obtenido. 
 * El resultado final es el dígito de control. Si el resultado es múltiplo 
 * de 10 el dígito de control será 0.
 * </li>
 * </ul>
 * <p>
 * Por ejemplo, para 123456789041 el dígito de control será:
 * <ul>
 * 		<li>Numeramos de derecha a izquierda: 140987654321</li>
 * 		<li>Suma de los números en los lugares impares: 1+0+8+6+4+2 = 21</li>
 * 		<li>Multiplicado (por 3): 21 × 3 = 63</li>
 * 		<li>Suma de los números en los lugares pares: 4+9+7+5+3+1 = 29</li>
 * 		<li>Suma total: 63 + 29 = 92</li>
 * 		<li>Decena inmediatamente superior = 100</li>
 * 		<li>Dígito de control: 100 - 92 = 8</li>
 * </lu>
 * </p>
 * <br>
 * <p>El código quedará así: 123456789041<b>8</b>.</p>
 * @author Jorge E. Villaverde
 * @version 1.0.0
 * @date 04/07/2011  
 */
@Target( { METHOD, FIELD, ANNOTATION_TYPE })
@Retention(RUNTIME)
@Constraint(validatedBy = EuropeanArticleNumberValidator.class)
@Documented
public @interface EuropeanArticleNumber {
	String message() default "{ar.com.greensoft.neosystem.model.constraint.EuropeanArticleNumber.message}";
	Class<?>[] groups() default {};
	Class<? extends Payload>[] payload() default {};
	
	/**
	 * Longitud del Código EAN. 13 por Defecto
	 * @return
	 */
	int value() default 13;
}
